package com.aaa.ss.service.impl;

import com.aaa.common.constants.CustomExcetionConstant;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.Result;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.TreeNode;
import com.aaa.ss.dao.MenuDao;
import com.aaa.ss.entity.Menu;
import com.aaa.ss.service.MenuService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 菜单权限表(Menu)表服务实现类
 *
 * @author makejava
 * @since 2021-01-19 15:20:11
 */
@Service("menuService")
public class MenuServiceImpl implements MenuService {
    @Resource
    private MenuDao menuDao;

    /**
     * 通过ID查询单条数据
     *
     * @param menuId 主键
     * @return 实例对象
     */
    @Override
    public Menu queryById(Integer menuId) {
        if(menuId==null||menuId==0){
            throw new CustomException(CustomExcetionConstant.ID_NOT_NULL.getErrorCode(),
                    CustomExcetionConstant.ID_NOT_NULL.getErrorMessage());
        }
//        系统异常
//        String s=null;
//        System.out.println(s.length());
        return this.menuDao.queryById(menuId);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Menu> queryAllByLimit(int offset, int limit) {
        return this.menuDao.queryAllByLimit(offset, limit);
    }


    /**
     * 新增数据
     *
     * @param menu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu insert(Menu menu) {
        this.menuDao.insert(menu);
        return menu;
    }

    /**
     * 修改数据
     *
     * @param menu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu update(Menu menu) {
        this.menuDao.update(menu);
        return this.queryById(menu.getMenuId());
    }

    /**
     * 通过主键删除数据
     *
     * @param menuId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer menuId) {
        return this.menuDao.deleteById(menuId) > 0;
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param menu 实例对象
     * @return 对象列表
     */
    @Override
    public PageInfo queryAll(int pageNo, int pageSize,Menu menu) {
        PageHelper.startPage(pageNo,pageSize);
        PageInfo<Menu> pageInfo=new PageInfo<Menu>(menuDao.queryAll(menu));
        return pageInfo;
    }

    @Override
    public List<TreeNode> queryAllMenuTree() {
        //获取所有数据
        List<TreeNode> treeNodes = menuDao.queryAllMenuTree();
        //定义新的集合，用户拼装返回后的数据
        List<TreeNode> treeNodeList=new ArrayList<>();
        //判断获取的数据是否为空
        if(!CollectionUtils.isEmpty(treeNodes)){
            //获取一级菜单
            for (TreeNode treeNode : treeNodes) {
                if(treeNode.getParentId()==0){
                    treeNodeList.add(treeNode);
                    //查找一级菜单的孩子
                    bindChildren(treeNode,treeNodes);
                }
            }
        }
        return treeNodeList;
    }

    //递归从集合中查找当前节点的子节点
    private void bindChildren(TreeNode currentNode,List<TreeNode> treeNodes){
        for (TreeNode treeNode : treeNodes) {
            //判断循环节点的父节点ID是否和当前节点相等，如果相等，说明当前循环节点是当前节点的孩子
            if(treeNode.getParentId()==currentNode.getId()){
                //获取当前节点的所有孩子，如果是第一孩子，获取集合为空
                List<TreeNode> children=currentNode.getChildren();
                if(children==null){
                    children=new ArrayList<>();
                }
                //把循环节点加入当前节点的孩子集合中
                children.add(treeNode);
                //再此设置孩子集合
                currentNode.setChildren(children);
                //递归 自己调用自己 为在当前循环节点继续找孩子
                bindChildren(treeNode,treeNodes);

            }
        }

    }
    @Override
    public Result queryMenuTreeByUserId(int userId) {
        //获取所有数据
        List<TreeNode> treeNodes = menuDao.queryMenuTreeByUserId(userId);
        //定义新的集合，用户拼装返回后的数据
        Map map=new HashMap<>();
        List<TreeNode> treeNodeList=new ArrayList<>();
        List<TreeNode> urlIsNotNullList=new ArrayList<>();
        //判断获取的数据是否为空
        if(!CollectionUtils.isEmpty(treeNodes)){
            //获取一级菜单
            for (TreeNode treeNode : treeNodes) {
                if(treeNode.getParentId()==0){
                    treeNodeList.add(treeNode);
                    //查找一级菜单的孩子
                    bindChildren(treeNode,treeNodes);
                }else{
                    urlIsNotNullList.add(treeNode);
                }
            }
        }
        map.put("treeNodeList",treeNodeList);
        map.put("urlIsNotNullList",urlIsNotNullList);

        return new Result(ResultStatus.SUCCESS.getCode(),
                ResultStatus.SUCCESS.getMessage(),map);
    }

    @Override
    public List<Menu> queryUrlIsNotNull() {
        Menu menu = new Menu();
        menu.setUrl("notNull");
        menu.setVisible("0");
        return menuDao.queryAll(menu);
    }
}